home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 July: Mac OS SDK / Dev.CD Jul 97 SDK1.toast / Development Kits (Disc 1) / Open Transport / OT1.1 Developer Release / Open Transport SDK / Open Tpt Client Developer / Samples / Internet / OTUdpCatchSample.cp < prev    next >
Encoding:
Text File  |  1996-11-19  |  8.6 KB  |  389 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        OTUdpCatchSample.cp
  3.  
  4.     Contains:    UDP catch sample.
  5.  
  6.     Copyright:    © 1993-1995 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10.  
  11. // OT UDP Catch Test Program (as an SIOW Tool)
  12.  
  13. #include <QuickDraw.h>
  14. #include <stdio.h>
  15. #include <StdLib.h>
  16. #include <TextUtils.h>
  17. #include <strings.h>
  18. #include <String.h>
  19. #include <Events.h>
  20. #include <Windows.h>
  21. #include <Desk.h>
  22. #include <Windows.h>
  23. #include <OpenTransport.h>
  24. #include <OpenTptInternet.h>
  25.  
  26.  
  27. /*******************************************************************************
  28. ** GLOBAL VARIABLES
  29. ********************************************************************************/
  30.  
  31. #define kMaxDataLen 256
  32.  
  33. InetPort    gCatchPort=0;
  34. InetHost    gCatchIpAddr=0;
  35. InetPort      gPitchPort=0;
  36. InetHost    gPitchIpAddr=0;
  37.  
  38. UInt16        gBindCompleted    = 0;
  39. UInt16        gDataToRead        = 0;
  40. UInt8        data[kMaxDataLen];
  41.  
  42. struct InetAddress reqsin, retsin, tmpsin;
  43.  
  44. Boolean    gFirstTime = true;
  45.  
  46. /*******************************************************************************
  47. ** Function Prototypes
  48. ********************************************************************************/
  49.  
  50. void        Inits();
  51. void        CleanUp();
  52. void        Idle();    
  53. void        DoIt();
  54. OSStatus    DoStaticBind(TEndpoint* ep);
  55. OSStatus    DoReceive(TEndpoint* ep);
  56. Boolean        UserAbort();
  57. OSStatus    DoGetInterfaceInfo(SInt32 i);
  58.  
  59.  
  60. /*******************************************************************************
  61. **  main function
  62. ********************************************************************************/
  63.  
  64. void main(int, char** ) 
  65. {
  66.     char userInput[256];
  67.  
  68.     do 
  69.     {
  70.         Inits();
  71.         DoIt();
  72.         CleanUp();
  73.         
  74.         fprintf(stderr, "Again (y/n)?\n");
  75.         gets(&userInput[0]);
  76.     } while ( userInput[0] == 'y' || userInput[0] == 'Y' );
  77.     
  78.     fprintf(stderr, "Bye\n");
  79.     exit (0);
  80. }
  81.  
  82. /*******************************************************************************
  83. ** Initialize Quickdraw and ASLM
  84. ********************************************************************************/
  85.  
  86. void Inits()
  87. {
  88.     if ( gFirstTime == true )
  89.     {
  90.         InitGraf(&qd.thePort);
  91.         gFirstTime = false;
  92.     }
  93.  
  94.     if ( InitOpenTransport() != kOTNoError )
  95.     {
  96.         fprintf(stderr, "OTUdpCatch: Could not initialize Open Transport, exiting\n");
  97.         exit(1);
  98.     }
  99. }
  100.  
  101. /*******************************************************************************
  102. ** Clean up at the end
  103. ********************************************************************************/
  104.  
  105. void CleanUp()
  106. {
  107.     CloseOpenTransport();
  108. }
  109.  
  110. /*******************************************************************************
  111. ** Idle
  112. ********************************************************************************/
  113.  
  114. void Idle()
  115. {
  116.     SystemTask();
  117. }
  118.  
  119. /*******************************************************************************
  120. ** EventHandler
  121. ********************************************************************************/
  122.  
  123. pascal void EventHandler(void*, OTEventCode event, OTResult, void*)
  124. {
  125.     if (event == T_DATA)
  126.     {
  127.         gDataToRead = 1;
  128.         return;
  129.     }
  130.     if (event == T_BINDCOMPLETE)
  131.     {
  132.         gBindCompleted = 1;
  133.         return;
  134.     }
  135.     return;
  136. }
  137.  
  138. /*******************************************************************************
  139. ** DoIt
  140. ********************************************************************************/
  141.  
  142. void DoIt()
  143. {
  144.     TEndpoint*        ep = NULL;
  145.     TEndpointInfo    info;
  146.     OSStatus        err = kOTNoError;
  147.     SInt32            myport = 0;
  148.     UInt32            myaddr = 0;
  149.     char            mystr[255];
  150.  
  151.     fprintf(stderr, "What UDP port should I listen to ?\n");
  152.     if ( gets(mystr) != 0 )
  153.     {
  154.         stringtonum(mystr, &myport);
  155.         gCatchPort = (InetPort) myport;
  156.     }
  157.     fprintf(stderr, "The program will listen for packets on port <%d>\n", gCatchPort);
  158.     fprintf(stderr, "until \'cmd .\' keys are pressed\n");
  159.     
  160.     OTInitInetAddress(&reqsin, gCatchPort, (InetHost) 0);
  161.  
  162.     do
  163.     {
  164.         //
  165.         // Now create a UDP
  166.         //
  167.         ep = OTOpenEndpoint(OTCreateConfiguration(kUDPName), 0, &info, &err);
  168.  
  169.         if ( ep == NULL || err != kOTNoError )
  170.         {
  171.             ep = NULL;
  172.             fprintf(stderr,"ERROR: OpenEndpoint(\"UDP\") failed with %d\n", err);
  173.             break;
  174.         }
  175.         //
  176.         // Install notifier we're going to use for testing
  177.         //
  178.         err = ep->InstallNotifier(&EventHandler, 0);
  179.         if ( err != kOTNoError )
  180.         {
  181.             fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
  182.             break;
  183.         }
  184.         ep->SetSynchronous();
  185.  
  186.         //
  187.         // Try to bind
  188.         // 
  189.         ep->SetAsynchronous();
  190.         err = DoStaticBind(ep);
  191.         if ( err != kOTNoError )
  192.             break;        
  193.         
  194.         //
  195.         // Display the interface info (IP address)
  196.         //
  197.         err = DoGetInterfaceInfo(0);
  198.         if ( err != kOTNoError )
  199.             break;        
  200.         
  201.         ep->SetAsynchronous();
  202.         do
  203.         {
  204.             //
  205.             // Try to receive some data
  206.             // 
  207.             if (gDataToRead == 1) {
  208.                 err = DoReceive(ep);
  209.                 if ( err != kOTNoError && err != kOTNoDataErr )
  210.                     break;
  211.             }
  212.             Idle();
  213.         } while (!UserAbort());
  214.         //
  215.         // Try to Unbind
  216.         // 
  217.         ep->SetSynchronous();
  218.         err = ep->Unbind();
  219.         if ( err != kOTNoError )
  220.         {
  221.             fprintf(stderr, "ERROR: Unbind() returned %d\n", err);
  222.             break;
  223.         }
  224.     } while (false);
  225.  
  226.     if ( ep != NULL )
  227.     {
  228.         //
  229.         // Remove notifier
  230.         //
  231.         ep->RemoveNotifier();
  232.         //
  233.         // Get rid of endpoint.
  234.         //
  235.         err = OTCloseProvider(ep);
  236.         if ( err != kOTNoError )
  237.         {
  238.             fprintf(stderr, "ERROR: CloseEndpoint() failed with %d\n", err);
  239.         }
  240.     }
  241. }
  242.  
  243. /*******************************************************************************
  244. ** DoStaticBind
  245. ********************************************************************************/
  246.  
  247. OSStatus DoStaticBind(TEndpoint* ep)
  248. {
  249.     TBind        req, ret;
  250.     OSStatus     err;
  251.  
  252.     // bind udp to current address and port 2001
  253.     req.addr.len = sizeof(struct InetAddress);
  254.     req.addr.buf = (unsigned char *) &reqsin;
  255.     req.qlen = 1;                                        // don't care for udp
  256.     ret.addr.maxlen = sizeof(struct InetAddress);
  257.     ret.addr.buf = (unsigned char *) &retsin;
  258.  
  259.     err = ep->Bind(&req, &ret);
  260.     if ( err != kOTNoError )
  261.     {
  262.         fprintf(stderr, "Static Bind returns %d\n", err);
  263.         return err;
  264.     }
  265.     while (gBindCompleted == 0)
  266.     {
  267.     }
  268.     gBindCompleted = 0;
  269.     return err;
  270. }
  271.  
  272. /*******************************************************************************
  273. ** DoReceive
  274. ********************************************************************************/
  275.  
  276. OSStatus DoReceive(TEndpoint* ep)
  277. {
  278.     OSStatus    err = kOTNoError;
  279.     TUnitData    unitdata;
  280.     OTFlags        flags;
  281.     char        mystr[255];
  282.  
  283.     // Receive a UDP datagram
  284.     gDataToRead = 0;
  285.     while ( true )
  286.     {
  287.         unitdata.addr.maxlen = sizeof(struct InetAddress);
  288.         unitdata.opt.maxlen = 0;
  289.         unitdata.opt.buf = 0;
  290.         unitdata.udata.maxlen = kMaxDataLen;
  291.         unitdata.udata.buf = data;
  292.         unitdata.addr.buf = (UInt8*) &tmpsin;
  293.     
  294.         err = ep->RcvUData( &unitdata, &flags);
  295.         if ( err == kOTNoError )
  296.         {
  297.             OTInetHostToString(tmpsin.fHost, mystr);
  298.             data[unitdata.udata.len] = '\0';
  299.             fprintf(stderr, "Packet from <%s:%d> : size: <%d> data: \"%s\"\n", mystr, 
  300.                     tmpsin.fPort, unitdata.udata.len, data);
  301.         }
  302.         else
  303.         {
  304.             if ( err != kOTNoDataErr )
  305.                 fprintf(stderr, "RcvUData returns %d\n", err);
  306.             break;
  307.         }
  308.     };
  309.     return err;
  310. }
  311.  
  312. /*******************************************************************************
  313. ** IsPressed
  314. ********************************************************************************/
  315.  
  316. Boolean IsPressed(UInt16 k, KeyMap map)
  317. {
  318.     UInt8* keyMap    = (UInt8*)map;
  319.     return (keyMap[k >> 3] >> (k & 7) & 1);
  320. }
  321.  
  322. /*******************************************************************************
  323. ** CmdKey
  324. ********************************************************************************/
  325.  
  326. Boolean UserAbort()
  327. {
  328.     KeyMap    keyMap;
  329.     
  330.     GetKeys(keyMap);
  331.     if ( IsPressed(0x37, keyMap) && 
  332.         (IsPressed(0x2F, keyMap) || IsPressed(0x41, keyMap)) )
  333.     {
  334.         FlushEvents(everyEvent, 0);    // needed so that "gets" gets not confused later on
  335.         return true;
  336.     }
  337.     else
  338.     {
  339.         return false;
  340.     }
  341. }
  342.  
  343. /*******************************************************************************
  344. ** DoGetInterfaceInfo
  345. ********************************************************************************/
  346.  
  347. OSStatus DoGetInterfaceInfo(SInt32 i)
  348. {
  349.     OSStatus            err;
  350.     InetInterfaceInfo    myInfo;
  351.     union
  352.     {
  353.         InetHost    addr;
  354.         UInt8        bytes[4];
  355.     } tmpAddr;
  356.     
  357.     do
  358.     {
  359.         memset(&myInfo, 0, sizeof(InetInterfaceInfo));
  360.         err = OTInetGetInterfaceInfo(&myInfo, i);
  361.         if (err != kOTNoError)
  362.         {
  363.             if (err == kOTNotFoundErr)
  364.             {
  365.                 fprintf(stderr, "Interface %d: Does Not Exist\n", i);
  366.                 break;
  367.             }
  368.             else
  369.             {
  370.                 fprintf(stderr, "Error! GetInterfaceInfo returns %d\n", err);
  371.                 break;
  372.             }
  373.         }
  374.         tmpAddr.addr = myInfo.fAddress;
  375.         fprintf(stderr, "Interface %d : Address = %d.%d.%d.%d\n ", i, tmpAddr.bytes[0],
  376.                 tmpAddr.bytes[1], tmpAddr.bytes[2], tmpAddr.bytes[3]);
  377.         tmpAddr.addr = myInfo.fNetmask;
  378.         fprintf(stderr, "Netmask = %d.%d.%d.%d\n ",  tmpAddr.bytes[0],
  379.                 tmpAddr.bytes[1], tmpAddr.bytes[2], tmpAddr.bytes[3]);
  380.         tmpAddr.addr = myInfo.fBroadcastAddr;
  381.         fprintf(stderr, "Broadcast Address = %d.%d.%d.%d\n",  tmpAddr.bytes[0],
  382.                 tmpAddr.bytes[1], tmpAddr.bytes[2], tmpAddr.bytes[3]);
  383.         fprintf(stderr, "\n");
  384.     } while ( false );
  385.     
  386.     return err;
  387. }
  388.  
  389.